<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // ES6 之前 类的创建不是靠类，是靠构造函数创建。
        // 三种创建对象方式
        // 1. var obj = new Object();   2. var obj= {};
        // 3. 利用构造函数创建  : 将公共的函数和属性抽到构造函数中
        function Star(name) {
            this.name = name;
            // this.sing = function () { 
            //     console.log("sing()");
            // }
        }
        Star.prototype.sing = function () { // 将方法放到原型对象中，所有Star对象可以共享, 避免重复开辟（方法）内存空间
            console.log("sing()");
        }
        Star.sex = '男'; // sex 是静态成员
        console.log(Star.sex);

        var jack = new Star('jack');
        var simi = new Star('simi');
        jack.sing(); // 对象中都会有一个属性__proto__指向构造函数的Prototype原型对象
        simi.sing();
        console.log(jack.sing === simi.sing);
        console.log(jack.__proto__ === Star.prototype);

        // 如果修改原型对象，给其复制一个对象，需要手动使用constructor指回原来的构造函数Star
        Star.prototype = {
            constructor: Star,
            say: function () {
                console.log("say()");
            },
            say2: function () {
                console.log("say2()");
            }
        }
        // 总结： 一般公共属性定义到构造函数中，方法则放到原型对象上
    </script>
</body>

</html>